"""
@version:
@filename : 三乐购物系统
@author : liuhongjie
@projectname: day02
@time: 2022/02/11
"""


"""
功能要求：
三乐购物系统 
使用系统需要登录验证，进入系统后，输入购物预算信息 
用户可以任意查看商品信息和已购买信息
用户根据商品编号购买商品，购买时，检测余额是否够，够就直接扣款，不够就提醒 
可随时退出（输入exit），退出后，打印已购买商品和余额
要求：用尽可能友好的方式输出(作业需要提交代码及执行结果截图) 
封装函数 {'F00001': {'name':'苹果', 'price':1.2}, 
'F00002': {'name':'香蕉', 'price':5.5}, }
三创购物系统优化
前置模块：excel操作模块xlsxwriter 
添加文档注释(document string)
扩展：将用户名密码余额存文件，下次进系统可直接用
商品存到excel
"""
import sys

# 定义一个采购清单，把购买物品的信息都写入进去
shopping_cart = {}
sum_price = 0


# 定义一个终止程序
def exit():
    if not shopping_cart:
        print("你的购物车为空，请加满你的购物车")
    else:
        print(f"你的购物车里有{shopping_cart}接下来将会结算")
    print(f"你要支付的金额为：{sum_price}元")
    end()


# 定义个用户列表
User = {'root': {'pas': '123456', '余额': '4000'},
        'lhj': {'pas': '2331422322', '余额': '500'}}

# 定义一个商品列表
shop = {'F001': {'name': '苹果', 'price': 1.2, 'count': 100},
        'F002': {'name': '荔枝', 'price': 5.5, 'count': 8},
        'F003': {'name': '梨子', 'price': 8.5, 'count': 200}
        }


# 登录系统函数
def Enter():
    global user_name, passwd
    print("返回菜单请按r")
    user_name = input("请输入用户名：")

    if user_name.upper() == 'R':
        return menu()

    elif user_name == 'exit':
        exit()
    else:

        passwd = input("请输入用户密码：")

        if passwd == 'exit':
            exit()
        else:
            if user_name in User and passwd == User[user_name]['pas']:

                print("登陆成功！")
                print("余额：", User[user_name]['余额'])
                print('''
                                 -------商品信息--------


                            F001:{name:苹果,price:1.2,count:100},
                            F002:{name:荔枝,price:5.5,count:8},
                            F003:{name:梨子,price:8.5,count:200}
                    ''')
                return shopping()

            else:
                print("输入密码错误或用户不存在！"
                      "请重新输入！")
                return Enter()


# 用户注册系统
def register():
    global user_name, passwd, money
    user_name = input("请输入你的用户名：")
    if user_name == 'exit':
        exit()
    else:
        # 判断用户名是否已经存在
        if user_name in User.keys():
            print("用户名已经存在请重新命名！")
            return register()

        else:
            passwd = input("请输入你的密码：")

            if passwd == 'exit':
                exit()
            else:
                money = input("请输入你的充值金额：")

                if money == 'exit':
                    exit()
                else:
                    money = float(money)

                    # 判断用户的充值金额是否大于50
                    if money <= 50:
                        print("注册失败!您存储的金额要大于50")
                        return register()
                    else:
                        User.update({user_name: {'pas': passwd, '余额': money}})
                        print("注册成功！"
                              "请选择你的操作选项")
                return menu()


# 购物函数
def shopping():
    global sum_price
    global shopping_cart
    print("按Q结账".center(50, '*'))
    while 1:
        number = input("请输入你要购买的物品编号（输入q退出本次购物）：")

        if number == 'exit':
            exit()

        elif number == ('q' or 'Q'):
            money = float(User[user_name]['余额']) - sum_price
            print("购物结束！本次消费如下：")
            print(shopping_cart)
            print("已支付：", sum_price)
            print("余额：", money)
            print("希望你本次购物愉快！")
            break

        elif number in shop.keys():
            amount = input("请输入你要采购的数量：")
            sum_price = 0
            if amount == 'exit':
                exit()

            # 判断输入是否为数字如果不是重新输入
            elif amount.isdigit():
                amount = float(amount)

                if amount > (shop[number]['count']):
                    print(f"库存不足，目前库存为{shop[number]['count']}")
                    continue

                else:

                    shop[number]['count'] -= amount
                    print(f"当前{shop[number]['name']}剩余：{shop[number]['count']}")

                    # 如果重复选中购物车中已有的商品
                    if shop[number]['name'] in shopping_cart.keys():
                        toal_price = float(shop[number]['price'] * amount)

                        # 因为是重复选购所以将两次购物信息合并为一个
                        shopping_cart.update({shop[number]['name']: {'单价': shop[number]['price'],
                                                                     '数量': float(shopping_cart[shop[number]['name']][
                                                                                     '数量'] + amount),
                                                                     '总价': float(shopping_cart[shop[number]['name']][
                                                                                     '总价'] + toal_price)}})
                    else:
                        toal_price = float(shop[number]['price'] * amount)
                        shopping_cart.update({shop[number]['name']: {'单价': shop[number]['price'],
                                                                     '数量': amount,
                                                                     '总价': toal_price}})

                    print("购物信息：", shopping_cart)

                    for i in shopping_cart.values():
                        sum_price = sum_price + float(i['总价'])

                    print("需要支付：", sum_price, "元")
                    money = float(User[user_name]['余额'])
                    print("卡内余额：", money, "元")
                    print("".center(50, '*'))

                    # money = float(User[user_name]['余额'])

                    if money - sum_price < 0:
                        print("你的余额不足！按1选择充值，按2选择放弃购物！")
                        option = input("请输入你的操作：")

                        if option == 'exit':
                            exit()
                        else:

                            option = int(option)

                            if option == 1:
                                return charge()
                            elif option == 2:
                                print("退出！")
                                break
                            else:
                                print("你的操作不合法！")
                                return shopping()


            else:
                print("输入错误！")
                # continue
                return shopping()






        else:
            print("输入编号不存在，请重新输入！")
            return shopping()


# 充值金额
def charge():
    charge_money = float(input("请输入要充值的金额："))
    User[user_name]['余额'] = float(User[user_name]['余额']) + charge_money
    print("充值成功！")
    print("余额为：", User[user_name]['余额'])
    return shopping()


# 结束语句
def end():
    print("购物结束！本次消费如下：")
    print(shopping_cart)
    print("已支付：", sum_price)
    print("希望你本次购物愉快！")
    sys.exit(0)


# 主菜单界面
def menu():
    print("欢迎来到三乐购物系统".center(100, "-"))

    print("1.登录")
    print("2.注册")
    print("3.退出")
    option = input("请输入你要执行的操作：")
    if option == 'exit':
        exit()
    else:

        if option == "1":
            return Enter()


        elif option == "2":
            return register()

        elif option == "3":
            print("退出")

        else:
            print("输入都不正确，请重新输入")
            return menu()


menu()

